package br.com.usp.server;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
 
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

 

import br.com.usp.shared.BMMDTO;
import br.com.usp.shared.ConnectorDTO;
import br.com.usp.shared.ConnectoresProcessDTO;
import br.com.usp.shared.DiagramaDTO;
import br.com.usp.shared.Processo;
 

@Entity(name="TB_DIAGRAMA")
public class Diagrama {

	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID_DIAGRAMA")
	private String id;
	
	@Column
	private String nome;
	
	@OneToMany(cascade=CascadeType.ALL ,mappedBy="diagrama")
	private List<BMM> listaBMM;
	
	@OneToMany(cascade=CascadeType.ALL ,mappedBy="diagrama")
	private List<ConnectorBMM> connectorBMM;
	
	public Diagrama(DiagramaDTO diagramaDTO)
	{
		this.id = diagramaDTO.getId();
		this.nome = diagramaDTO.getNome();
		
		if( this.listaBMM == null)
		{
	    	this.listaBMM = new ArrayList<BMM>();
	    	for(BMMDTO bmm : diagramaDTO.getListaBMM())
			{
				 BMM e = new BMM(bmm);
			     e.setDiagrama(this);
			     if(bmm.getTipo().equals("Process"))
			     {
			    	 for(BMMDTO bmm2 :  bmm.getListaBMM())
			    	 {
			    		 ProcessFlow p = new ProcessFlow(bmm2);
			    		 p.setProcesso(e);
			    		 if(bmm2.getTipo().equals("SubProcess"))
					     {
					    	 for(BMMDTO bmm3 :  bmm2.getListaBMM())
					    	 {
					    		 ActivityFlow a = new ActivityFlow(bmm3);
					    		 a.setProcesso(p);
					    		 if(bmm3.getTipo().equals("Activity"))
							     {
							    	 for(BMMDTO bmm4 :  bmm3.getListaBMM())
							    	 {
							    		 TaskFlow t = new TaskFlow(bmm4);
							    		 t.setActivity(a);
							    		 a.getListaTask().add(t);
							    	 }
							     }
					    		 p.getListaActivity().add(a);
					    	 }
					    	 
					     }
			    		 e.getListaProcess().add(p);
			    	 }
			     }
				 listaBMM.add(e);
			}
		}
		if(this.connectorBMM == null)
		{
		   this.connectorBMM = new ArrayList<ConnectorBMM>();
       	   for(ConnectorDTO coBMM : diagramaDTO.getLstConnect())
		   {
			  ConnectorBMM co = new ConnectorBMM();
			  co.setDiagrama(this);
			  ArrayList<BMM> listaAtualizadaBMM = new ArrayList<BMM>();
			  for(BMM obj : listaBMM)
			  {
				  if(obj.getDescricao().equals(coBMM.getDe().getDescricao()) && obj.getTipo().equals(coBMM.getDe().getTipo()))
			      {
			    		co.setDe(obj);
			    		obj.getListaConnectorDe().add(co);
			      }
			    	
			      if(obj.getDescricao().equals(coBMM.getPara().getDescricao()) && obj.getTipo().equals(coBMM.getPara().getTipo()))
			      {
			    	  	co.setPara(obj);
			    		obj.getListaConnectorPara().add(co);
			      }
			      
			      if(obj.getTipo().equals("Process"))
				  {
				        BMMDTO b  = getDTOPorDescricao(obj.getDescricao(), diagramaDTO.getListaBMM(), "Process");
				        for (ConnectorDTO coBMM2 : b.getListaConnector()) {
				        	 ConnectorProcess co2 = new ConnectorProcess();
				        	 co2.setProcesso(obj); 
				        	 for(ProcessFlow obj2 : obj.getListaProcess())
				        	 {
				        		 if(obj2.getDescricao().equals(coBMM2.getDe().getDescricao()) && obj2.getTipo().equals(coBMM2.getDe().getTipo()))
							      {
							    		co2.setDe(obj2);
							    		obj2.getListaConnectorProcessDe().add(co2);
							      }
							    	
							      if(obj2.getDescricao().equals(coBMM2.getPara().getDescricao()) && obj2.getTipo().equals(coBMM2.getPara().getTipo()))
							      {
							    	  	co2.setPara(obj2);
							    		obj2.getListaConnectorProcessPara().add(co2);
							      }
							      
							      if(obj2.getTipo().equals("SubProcess"))
								  {
								        BMMDTO b2  = getDTOPorDescricao(obj2.getDescricao(), b.getListaBMM(), "SubProcess");
								        for (ConnectorDTO coBMM3 : b2.getListaConnector()) {
								        	 ConnectorActivity co3 = new ConnectorActivity();
								        	 co3.setProcesso(obj2); 
								        	 for(ActivityFlow obj3 : obj2.getListaActivity())
								        	 {
								        		 if(obj3.getDescricao().equals(coBMM3.getDe().getDescricao()) && obj3.getTipo().equals(coBMM3.getDe().getTipo()))
											      {
											    		co3.setDe(obj3);
											    		obj3.getListaConnectorActivityDe().add(co3);
											      }
											    	
											      if(obj3.getDescricao().equals(coBMM3.getPara().getDescricao()) && obj3.getTipo().equals(coBMM3.getPara().getTipo()))
											      {
											    	  	co3.setPara(obj3);
											    		obj3.getListaConnectorActivityPara().add(co3);
											      }
											      
											      if(obj3.getTipo().equals("Activity"))
												  {
												        BMMDTO b3  = getDTOPorDescricao(obj3.getDescricao(), b2.getListaBMM(), "Activity");
												        for (ConnectorDTO coBMM4 : b3.getListaConnector()) {
												        	 ConnectorTask co4 = new ConnectorTask();
												        	 co4.setActivity(obj3); 
												        	 for(TaskFlow obj4 : obj3.getListaTask())
												        	 {
												        		  if(obj4.getDescricao().equals(coBMM4.getDe().getDescricao()) && obj4.getTipo().equals(coBMM4.getDe().getTipo()))
															      {
															    		co4.setDe(obj4);
															    		obj4.getListaConnectorTaskDe().add(co4);
															      }
  												        		  if(obj4.getDescricao().equals(coBMM4.getPara().getDescricao()) && obj4.getTipo().equals(coBMM4.getPara().getTipo()))
															      {
															    	  	co4.setPara(obj4);
															    		obj4.getListaConnectorTaskPara().add(co4);
															      }
												        	 }
												        	 
												        	 
												        }
												        
												        
												  }
											      
											      
								        	 }
								        	 
								        	 
								        }
								        
								        
								  }		
				        	 }
				        	 
				        	 
				        }
				        
				        
				  }			        	
				        	
				        	
			      
			      listaAtualizadaBMM.add(obj);
			  }
			  this.listaBMM = listaAtualizadaBMM;
			  connectorBMM.add(co);
			
		   }
		}
		
	
	}
	
       	private BMMDTO getDTOPorDescricao(String descricao, List<BMMDTO> listaDTO, String tipo)
       	{
       		BMMDTO b = new BMMDTO();
       		for(BMMDTO bAux : listaDTO)
       		{
       		       if(bAux.getTipo().equals(tipo) && bAux.getDescricao().equals(descricao))      		
       		       {
       		    	   b = bAux;
       		       }
       		}
       		return b;
       	}
       	   

	public Diagrama()
	{

		
	}
	
	
	public List<BMM> getListaBMM() {
		return listaBMM;
	}

	public void setListaBMM(List<BMM> listaBMM) {
		this.listaBMM = listaBMM;
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}


	public List<ConnectorBMM> getConnectorBMM() {
		return connectorBMM;
	}


	public void setConnectorBMM(List<ConnectorBMM> connectorBMM) {
		this.connectorBMM = connectorBMM;
	}
	
	
	
	
}
